package com.yuyan.openapi.controller;

import com.alibaba.fastjson2.JSONObject;
import com.yuyan.openapi.rest.YuyanRestUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 资金相关接口
 *
 * @author xm
 * @date 2024/4/9
 **/
@RestController
public class FundController {
    @Autowired
    private YuyanRestUtil yuyanRestUtil;
    @Value("${yuyan.mc_no}")
    public String mc_no;
    @Value("${yuyan.div_callback}")
    public String div_callback;
    @Value("${yuyan.transfer_callback}")
    public String transfer_callback;
    @Value("${yuyan.transfer_batch_callback}")
    public String transfer_batch_callback;
    @Value("${yuyan.transfer_batch_callback}")
    public String mc_pay_callback;
    private final String requestNo = System.currentTimeMillis() + "";

    /**
     * 商户钱包转账
     *
     * @return
     */
    @GetMapping("mcTransfer")
    public Object mcTransfer() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("payType", "4");
        requestMap.put("transferType", "");
        requestMap.put("payeeNo", "");
        requestMap.put("amount", "");
        requestMap.put("remark", "");
        requestMap.put("notifyUrl", transfer_callback);
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/mcTransfer");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户钱包转账重新发送验证码
     *
     * @return
     */
    @GetMapping("transferResetCode")
    public Object transferResetCode() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("transferNo", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/transferResetCode");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户钱包转账确认
     *
     * @return
     */
    @GetMapping("transferConfirm")
    public Object transferConfirm() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("transferNo", "");
        requestMap.put("smsCode", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/transferConfirm");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户钱包转账查询
     *
     * @return
     */
    @GetMapping("transferInfo")
    public Object transferInfo() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("transferNo", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/transferInfo");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户钱包批量转账
     *
     * @return
     */
    @GetMapping("mcTransferBatch")
    public Object mcTransferBatch() {
        List<JSONObject> divs = new ArrayList<>();
        JSONObject div = new JSONObject();
        div.put("requestNo", requestNo);
        div.put("payeeNo", "SDYYW2024032300000001");
        div.put("amount", "0.01");
        divs.add(div);
//        div = new JSONObject();
//        div.put("requestNo", requestNo);
//        div.put("payeeNo", "SDYYW2024032300000001");
//        div.put("amount", "0.01");
//        divs.add(div);

        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("payType", "4");
        requestMap.put("transferType", "5");
        requestMap.put("remark", "测试");
        requestMap.put("notifyUrl", transfer_batch_callback);
        requestMap.put("transfers", JSONObject.toJSONString(divs));
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/mcTransferBatch");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 批量转账查询
     *
     * @return
     */
    @GetMapping("transferBatchInfo")
    public Object transferBatchInfo() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("transferNo", "TB202405060000004");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/transferBatchInfo");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户钱包批量转账重新发送验证码
     *
     * @return
     */
    @GetMapping("transferBatchResetCode")
    public Object transferBatchResetCode() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("transferNo", "TB202405060000004");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/transferBatchResetCode");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户钱包批量转账确认
     *
     * @return
     */
    @GetMapping("transferBatchConfirm")
    public Object transferBatchConfirm() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("transferNo", "TB202405060000004");
        requestMap.put("smsCode", "571583");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/transferBatchConfirm");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }


    /**
     * 订单分账
     *
     * @return
     */
    @GetMapping("orderDiv")
    public Object orderDiv() {
        // 分账商户列表
        List<JSONObject> divs = new ArrayList<>();
        JSONObject div = new JSONObject();
        div.put("divNo", "");
        div.put("divNoType", "");
        div.put("isChargeFee", "");
        div.put("divRatio", "");
        divs.add(div);

        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", requestNo);
        requestMap.put("tradeNo", "");
        requestMap.put("divItems", JSONObject.toJSONString(divs));
        requestMap.put("notifyUrl", div_callback);
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/orderDiv");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 订单分账查询
     *
     * @return
     */
    @GetMapping("orderDivQuery")
    public Object orderDivQuery() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("orderNo", requestNo);
        requestMap.put("tradeNo", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/orderDivQuery");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }


    /**
     * 商户余额代付
     *
     * @return
     */
    @GetMapping("mcPay")
    public Object mcPay() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("payType", "3");
        requestMap.put("feeChargeSide", "1");
        requestMap.put("receiveType", "1");
        requestMap.put("accountNo", "");
        requestMap.put("accountName", "");
        requestMap.put("accountType", "");
        requestMap.put("bankCode", "");
        requestMap.put("branchBankCode", "");
        requestMap.put("amount", "0.01");
        requestMap.put("remark", "测试");
        requestMap.put("notifyUrl", mc_pay_callback);
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/mcPay");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }

    /**
     * 商户余额代付查询
     *
     * @return
     */
    @GetMapping("mcPayInfo")
    public Object mcPayInfo() {
        Map<String, Object> requestMap = new HashMap<>();
        requestMap.put("mcNo", mc_no);
        requestMap.put("requestNo", requestNo);
        requestMap.put("mcPayNo", "");
        try {
            JSONObject jsonObject = yuyanRestUtil.post(requestMap, "/v1/fund/mcPayInfo");

            if (!"Y000".equals(jsonObject.getString("code"))) {
                // todo 这是网关非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("msg"));
            }

            if (!"S000".equals(jsonObject.getString("subCode"))) {
                // todo 这是业务非成功的返回，做一些逻辑处理，具体状态码可查看文档
                throw new RuntimeException(jsonObject.getString("subMsg"));
            }

            // todo 拿到业务数据，继续业务处理即可，例如保存单号，然后返回给前端唤起支付等
            jsonObject.put("data", jsonObject.getJSONObject("data"));
            return jsonObject;
        } catch (Exception e) {
            return e.getMessage();
        }
    }
}
